import axios from 'axios'
import store from '@/store';
import { Message } from 'element-ui';
import { Loading } from 'element-ui';

// 创建axios实例
const request = axios.create({
   baseURL: 'http://localhost:9999/api',
  // baseURL: 'http://47.107.171.173:8088/api',
  timeout: 5000
})

let loadingInstance;

// 请求拦截器
request.interceptors.request.use(config => {
  // 启动loading（如果未指定不显示loading）
  if (config.showLoading !== false) {
    loadingInstance = Loading.service({
      text: '加载中',
      spinner: 'el-icon-loading'
    });
  }

  // 处理请求头：非FormData且未自定义headers时，默认设置json类型
  if (!(config.data instanceof FormData) && !config.headers['Content-Type']) {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
  }

// 携带 token 到 Authorization 头（规范格式）
const user = store.state.user.userInfo;
if (user && user.token) { // 确保 token 存在
  // 标准格式：Authorization: Bearer <token>
  config.headers['Authorization'] = `Bearer ${user.token}`;
}

  return config
}, error => {
  // 请求失败时关闭loading
  if (loadingInstance) {
    loadingInstance.close();
  }
  Message.error(error.message || '请求发送失败');
  return Promise.resolve({data: null}); // 返回包含data属性的对象
});


// 响应拦截器
request.interceptors.response.use(
  response => {
    // 关闭loading（如果开启了）
    if (loadingInstance && response.config.showLoading !== false) {
      loadingInstance.close();
    }

    // 二进制响应类型（blob/arraybuffer）直接返回原始数据，不做JSON解析
    const responseType = response.config.responseType;
    if (responseType === 'blob' || responseType === 'arraybuffer') {
      return response.data; // 直接返回二进制数据（Blob/ArrayBuffer）
    }

    // 非二进制响应：处理字符串转JSON
    let res = response.data;
    if (typeof res === 'string') {
      try {
        res = JSON.parse(res); // 尝试解析JSON
      } catch (e) {
        // 如果解析失败，可能是后端返回了非JSON字符串，直接返回原始值
        return res;
      }
    }

    // 处理后端返回的错误状态
    if (res.status === 'error') {
      Message.error(res.message || '操作失败');
      return Promise.resolve({data: null}); // 返回包含data属性的对象
    }

    // 处理成功提示（默认显示，可通过配置关闭）
    if (response.config.showSuccessMessage !== false) {
      Message.success(res.message || '操作成功');
    }

    return res;
  },
  error => {
    // 错误时关闭loading
    if (loadingInstance) {
      loadingInstance.close();
    }

    // 统一错误提示
    const errorMsg = error.response?.data?.message || error.message || '请求失败';
    Message.error(errorMsg);
    return Promise.resolve({data: null}); // 返回包含data属性的对象
  }
)

export default request
